package com.ruoyi.system.service.impl;

import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.dto.UserSalaryDTO;
import com.ruoyi.common.core.domain.entity.SysSalary;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.mapper.SysSalaryMapper;
import com.ruoyi.system.service.ISysSalaryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 薪资信息 服务层处理
 * 
 * @author Kelsey
 */
@Service
public class SysSalaryServiceImpl implements ISysSalaryService {

    @Autowired
    private SysSalaryMapper sysSalaryMapper;

    /**
     * 查看薪资列表
     *
     * @param salary 条件查询
     * @return 薪资列表
     */
    @Override
    public List<SysSalary> selectSalaryList(SysSalary salary) {
        return sysSalaryMapper.selectSalaryList(salary);
    }

    /**
     * 修改薪资信息
     * 
     * @param salary 薪资信息
     * @return 结果
     */
    @Override
    public int updateSalary(SysSalary salary) {
        return sysSalaryMapper.updateSalary(salary);
    }

    /**
     * 批量删除薪资信息
     * 
     * @param salaryIds 需要删除的薪资ID
     * @return 结果
     */
    @Override
    public int deleteSalaryByIds(Long[] salaryIds) {
        for (Long salaryId : salaryIds) {
            SysSalary salary = selectSalaryById(salaryId);
            if (StringUtils.isNull(salary)) {
                throw new ServiceException(String.format("薪资ID %1$s 不存在，无法删除", salaryId));
            }
        }
        return sysSalaryMapper.deleteSalaryByIds(salaryIds);
    }

    /**
     * 新增保存薪资信息
     * 
     * @param salary 薪资信息
     * @return 结果
     */
    @Override
    public int insertSalary(SysSalary salary) {
        return sysSalaryMapper.insertSalary(salary);
    }

    /**
     * 通过薪资ID查询薪资信息
     * 
     * @param salaryId 薪资ID
     * @return 薪资对象信息
     */
    @Override
    public SysSalary selectSalaryById(Long salaryId) {
        return sysSalaryMapper.selectSalaryById(salaryId);
    }

    /**
     * 校验该用户在该月份是否存在薪资信息
     * 
     * @param salary 薪资信息
     * @return 结果
     */
    @Override
    public boolean checkSalaryExist(SysSalary salary) {
        Long salaryId = StringUtils.isNull(salary.getSalaryId()) ? -1L : salary.getSalaryId();
        SysSalary info = sysSalaryMapper.checkSalaryExist(salaryId, salary.getSalaryMonth());
        if (StringUtils.isNotNull(info) && info.getSalaryId().longValue() != salaryId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 删除薪资信息
     * 
     * @param salaryId 薪资ID
     * @return 结果
     */
    public int deleteSalaryById(Long salaryId) {
        return sysSalaryMapper.deleteSalaryById(salaryId);
    }

    /**
     * 查询用户薪资信息（显式JOIN查询）
     * 
     * @return 用户薪资列表
     */
    @Override
    public List<UserSalaryDTO> selectUserSalaryWithExplicitJoin() {
        return sysSalaryMapper.selectUserSalaryWithExplicitJoin();
    }

    /**
     * 查询用户薪资信息（隐式JOIN查询）
     * 
     * @return 用户薪资列表
     */
    @Override
    public List<UserSalaryDTO> selectUserSalaryWithImplicitJoin() {
        return sysSalaryMapper.selectUserSalaryWithImplicitJoin();
    }
}